package com.aizhixin.lab.jsrun.util;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UnusualCode {
    public final static Map<String, String> JAVA = new LinkedHashMap() {{
        put("ArithmeticException", "算术异常");
        put("ArrayIndexOutOfBoundsException", "使用的数组下标越界,请注意数组下标是从0开始的而不是1！");
        put("ArrayStoreException", "数组存储异常，向数组中存放非数组声明类型对象！");
        put("NullPointerException", "空指针异常，应用试图在要求使用对象的地方使用了null！");
        put("NoSuchFieldException", "属性不存在异常。当访问某个类的不存在的属性时抛出该异常！");
        put("NegativeArraySizeException", "数组大小为负值异常。当使用负数大小值创建数组时抛出该异常！");
        put("InterruptedException", "被中止异常，某个线程处于长时间的等待、休眠或其他暂停状态，而此时其他的线程通过Thread的interrupt方法终止该线程！");
        put("IllegalAccessException", "违法的访问异常，应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法，而当时又无法访问类的、属性的、方法的或构造方法！");
        put("EnumConstantNotPresentException", "枚举常量不存在异常，应用试图通过名称和枚举类型访问一个枚举对象，但该枚举对象并不包含常量！");
        put("CloneNotSupportedException", "不支持克隆异常，没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常！");
        put("ClassNotFoundException", "找不到类异常，应用试图根据字符串形式的类名构造类，而在遍历CLASSPAH之后找不到对应名称的class文件！");
        put("ClassCastException", "强制类型转换异常！");
        put("error: <identifier> expected", "编译错误，请仔细检查代码！");
        put("not a statement", "代码错误或缺少符号，请仔细检查代码！");
        put("does not exist", "未在包中找到所需的文件,请检查代码！");
        put("cannot find symbol", "代码编译错误，请检查代码如大小写、下划线、词组拼写是否正确！");
        put("FileNotFoundException", "文件未找到异常！");
        put("Main method not found in class Main", "类中没有找到入口mian方法！");
        put("StringIndexOutOfBoundsException", "字符串索引越界异常,使用索引值访问某个字符串中的字符，而该索引值小于0或大于等于序列大小！");
        put("VirtualMachineError", "虚拟机错误，虚拟机被破坏或者继续执行操作所需的资源不足！");
        put("UnsupportedClassVersionError", "不支持的类版本错误，Java虚拟机试图从读取某个类文件，但是发现该文件的主、次版本号不被当前Java虚拟机支持！");
        put("UnsatisfiedLinkError", "未满足的链接错误，Java虚拟机未找到某个类的声明为native方法的本机语言定义！");
        put("UnknownError", "未知错误，Java虚拟机发生了未知严重错误的情况！");
        put("ThreadDeath", "线程结束，当调用Thread类的stop方法时抛出该错误，用于指示线程结束！");
        put("StackOverflowError", "堆栈溢出错误，应用递归调用的层次太深而导致堆栈溢出！");
        put("error: ';' expected", "代码缺少分号，请检查代码！");
        put("error: ']' expected", "代码缺少中括号，请检查代码！");
        put("error: ')' expected", "代码缺少括号，请检查代码！");
        put("String index out of range:", "字符串没有找到索引！");
        put("OutOfMemoryError", "内存不足错误，内存不足以让Java虚拟机分配给一个对象！");
        put("reached end of file while parsing", "错误匹配的括号--你可以看到你的代码中的每一个开着的括弧，它可能是一个方括号，大括弧或圆括号，你需要一个与之匹配的关闭的括弧");
        put("Could not find or load main class", "语法结构错误，当前mian方法没有放入类中！");
    }};

    public final static Map<String, String> PYTHON = new LinkedHashMap() {{
        put("FileNotFoundError: [Errno 2] No such file or directory", "找不到目标文件，请确认文件路径是否正确或文件是否存在！");
        put("AttributeError", "访问一个对象的属性，但是这个属性并没有这个对象定义！");
        put("ImportError", "在使用 import 导入模块时，导入的模块找不到或者从模块中导入模块中不存在的内容！");
        put("IndexError", "尝试从序列（如列表或元组）中检索索引，但是序列中找不到该索引！");
        put("KeyError", "读取dict时key不存在！");
        put("NameError", "引用了变量没有定义！");
        put("TabError", "相邻的两句的缩进需要统一使用tab或统一使用空格不能混用！");
        put("TypeError", "类型错误试图对一个无法执行此操作的对象执行操作！");
        put("ValueError", "对象的值不正确！");
        put("IndentationError", "代码缩进问题，请调整代码！");
        put("UnboundLocalError", "局部作用域引用错误，可能原因是变量为局部变量，未定义，不可修改！");
        put("UnsupportedOperation", "文件不可读，可能是文件打开模式不对！");
        put("but no encoding declared", "编码错误如果文件中含有中文，应在文件开头加上一句 #coding=utf-8！");
        put("SyntaxError", "代码语法错误！");
    }};

    public final static Map<String, String> CLang = new LinkedHashMap() {{
        put("count exceeds number", "(编译错误)错误太多，停止编译！");
        put("expected '=', ',', ';', 'asm' or '__attribute__' before '{' token", "(编译错误)语法错误缺少必要的符号！");
        put("unexpected end of file found", "(编译错误)文件未结束,一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现！");
        put("Cannot open include file", "(编译错误)无法打开头文件xxx：没有这个文件或路径！");
        put("unable to recover from previous", "(编译错误)无法从之前的错误中恢复，停止编译！");
        put("newline in constant", "(编译错误)常量中创建新行！");
        put("include expected a filename", "(编译错误)#include命令中需要文件名！");
        put("define syntax", "(编译错误)#define语法错误！");
        put("unexpected in macro definition", "(编译错误)宏定义时出现了错误！");
        put("reuse of macro formal", "(编译错误)带参宏的形式参数重复使用！");
        put("unexpected in macro formal parameter list", "(编译错误)带参宏的形式参数表中出现未知字符！");
        put("preprocessor command must start as first nonwhite space", "(编译错误)预处理命令前面只允许空格！");
        put("too many characters in constant", "(编译错误)常量中包含多个字符！");
        put("illegal escape sequence", "(编译错误)转义字符非法！");
        put("unknown character", "(编译错误)未知的字符！");
        put("expected preprocessor directive", "(编译错误)期待预处理命令，但有无效字符！");
        put("expected exponent value", "(编译错误)期待指数值，不能是字符！");
        put("'identifier1' : is not a member of 'identifier2'", "(编译错误)标识符1不是标识符2的成员！");
        put("illegal digit", "(编译错误)对于n进制来说数字x非法！");
        put("more than one default", "(编译错误)default语句多于一个！");
        put("switch expression not integral", "(编译错误)switch表达式不是整型的！");
        put("case expression not constant", "(编译错误)case表达式不是常量！");
        put("illegal type for case expression", "(编译错误)case表达式类型非法！");
        put("expected constant expression", "(编译错误)期待常量表达式！");
        put("constant expression is not integral", "(编译错误)常量表达式不是整数！");
        put("syntax error", "(编译错误)语法错误！");
        put("term does not evaluate to a function", "(编译错误)无法识别函数语言！");
        put("undeclared identifier", "(编译错误)标识符未定义！");
        put("too many initializers", "(编译错误)初始值过多！");
        put("redefinition of formal parameter", "(编译错误)重复定义形式参数！");
        put("already has a body", "(编译错误)已存在定义函数！");
        put("redefinition", "(编译错误)标识符xxx重定义！");
        put("missing subscript", "(编译错误)下标未知！");
        put("illegal indirection", "(编译错误)非法的间接访问运算符！");
        put("'operator' needs l-value", "(编译错误)操作符需要左值！");
        put("left operand must be l-value", "(编译错误)操作符的左操作数必须是左值！");
        put("cannot add two pointers", "(编译错误)两个指针量不能相加！");
        put("array bounds overflow", "(编译错误)数组边界溢出！");
        put("missing terminating \" character", "(编译错误)没有以\"终止符结束语句！");
        put("negative subscript or subscript is too large", "(编译错误)下标为负或下标太大！");
        put("unknown size", "(编译错误)数组长度未知！");
        put("expected declaration specifiers", "(编译错误)缺少头文件或函数是否定义在main函数中！");
        put("expected identifier", "(编译错误)出现未知字符！");
        put("empty character constant", "(编译错误)字符型常量为空！");
        put("missing 'token1' before 'token2'", "(编译错误)在标识符或语言符号2前漏写语言符号1！");
        put("missing ')' before type", "(编译错误)类型前缺少')'！");
        put("error: expected ';' before '}' token", "(编译错误)}前缺少;！");
        put("expected ';' before 'return'", "(编译错误)语句缺少;！");
        put("ld returned 1 exit status", "main函数出了问题，查看是否把函数的定义写到了main函数中！");
        put("illegal else without matching if", "(编译错误)非法的没有与if相匹配的else！");
        put("case value '0' already used", "(编译错误)case值0已使用！");
        put("illegal, left operand has type 'float'", "(编译错误)%运算的左(右)操作数类型为float，这是非法的！");
        put("redefinition; different basic types", "(编译错误)标识符重定义,基类型不同！");
        put("cannot convert from 'char [2]' to 'char'", "(编译错误)赋值运算，无法从字符数组转换为字符！");
        put("missing function header (old-style formal list?)", "(编译错误)缺少函数标题(是否是老式的形式表?)！");
        put("switch expression of type", "(编译错误)switch表达式为非法的未知类型！");
        put("cannot allocate an array of constant size 0", "(编译错误)不能分配长度为0的数组！");
        put("local function definitions are illegal", "(编译错误)函数定义非法！");
        put("'type1' followed by 'type2' is illegal", "(编译错误)类型1后紧接着类型2，这是非法的！");
        put("function does not take n parameters", "(编译错误)函数不能带n个参数,调用函数时实参个数不对！");
        put("cannot convert parameter n from 'type1' to 'type2'", "(编译错误)函数不能将第n个参数从类型1转换为类型2！");
        put("class istream_withassign", "运算符使用错误！");
        put("must return a value", "(编译错误)函数必须返回一个值！");
        put("cannot open Debug/Cpp1.exe for writing", "(链接错误)不能打开Debug/Cpp1.exe文件，以改写内容！");
        put("cannot open file", "(链接错误)无法打开文件Debug/Cpp1.exe！");
        put("one or more multiply defined symbols found", "(链接错误)出现一个或更多的多重定义符号！");
        put("unresolved external symbol _main", "(链接错误)未处理的外部标识main！");
        put("_main already defined in Cpp1.obj", "(链接错误)main函数已经在Cpp1.obj文件中定义！");
        put("not enough actual parameters for macro", "(编译警告)宏没有足够的实参！");
        put("unexpected tokens following preprocessor directive - expected a newline", "(编译警告)预处理命令后出现意外的符号 - 期待新行！");
        put("ignored on left of ‘type’ when no variable is declared", "(编译警告)当没有声明变量时忽略类型说明！");
        put("unreferenced local variable", "(编译警告)变量定义了但未使用！");
        put("'=' : conversion from 'type1' to 'type2', possible loss of data", "代码语法错误！");
        put("truncation from 'const double' to 'float'", "(编译警告)初始化，截取双精度常量为float类型！");
        put("';' : empty controlled statement found; is this the intent?", "(编译警告)‘;’控制语句为空语句，是程序的意图吗?！");
        put("operator has no effect; expected operator with side-effect", "(编译警告)运算符无效果！");
        put("used without having been initialized", "(编译警告)变量在使用前未初始化！");
        put("not all control paths return a value", "(编译警告)不是所有函数控制路径都有返回值！");
        put("potential divide by 0", "(编译警告)有可能被0除！");
        put("unsafe use of type 'bool' in operation", "(编译警告)不安全的布尔类型的使用！");
    }};


    public final static Map<String, String> JAVA_GRAMMAR_REGULARITY_CHECK = new LinkedHashMap() {{
        put("if\\(\\)|while\\(\\)|for\\(\\)|else\\(\\)|switch\\(\\)|catch\\(\\)","if( while( for(等if和(之间需要间隔一个空格");
        put("\\w=\\w|\\w=\\d|\\w=\\\"|\\s=\\\"|\\s=\\d|\\\"=\\s|\\w=\\s|\\w==\\w|\\w==\\d|\\w==\\\"|\\s==\\\"|\\w==\\s|\\s==\\d|\\\"==\\s","等号前后需要间隔一个空格");
        put("int.(.),.*|String.*,.*|long.*,.*|char.*,.*|byte.*,.*|double.*,.*|boolean.*,.*|short.*,.*|float.*,.*","建议定义变量时一行最好只定义一个变量并进行一个初始化赋值");
        put("\\d\\>\\d|\\d\\>\\s|\\s\\>\\d|\\w\\>\\w|\\d\\>\\w|\\s\\>\\w","> 前后应该间隔一个空格");
        put("\\d\\<\\d|\\d\\<\\s|\\s\\<\\d|\\w\\<\\w|\\d\\<\\w|\\s\\<\\w","< 前后应该间隔一个空格");
        put("\\w&&\\w|\\w&&d|\\w&&\\\"|\\s&&\\\"|\\s&&\\d|\\\"&&\\s|\\w&&\\s|\\w&\\w|\\w&\\d|\\w&\\\"|\\s&\\\"|\\w&\\s|\\s&\\d|\\\"&\\s|\\\"&\\\"|\\\"&\\s|\\\"&&\\\"","& 或者 && 前后应该间隔一个空格");
        put("\\w\\|\\|\\w|\\w\\|\\|d|\\w\\|\\|\\\"|\\s\\|\\|\\\"|\\s\\|\\|\\d|\\\"\\|\\|\\s|\\w\\|\\|\\s|\\w\\|\\w|\\w\\|\\d|\\w\\|\\\"|\\s\\|\\\"|\\w\\|\\s|\\s\\|\\d|\\\"\\|\\s|\\\"\\|\\\"|\\\"\\|\\s|\\\"\\|\\|\\\"","|或者||前后应该间隔一个空格");
        put("\\d\\~\\d|\\d\\~\\s|\\s\\~\\d|\\w\\~\\w|\\d\\~\\w|\\s\\~\\w","~ 前后应该间隔一个空格");
        put("\\w\\+\\w|\\w\\+\\d|\\w\\+\\\"|\\s\\+\\\"|\\w\\+\\s|\\s\\+\\d|\\\"\\+\\s|\\\"\\+\\\"|\\\"\\+\\s|\\\"\\+\\\"","+ 前后应该间隔一个空格");
        put("\\d\\<\\<\\d|\\d\\<\\<\\s|\\s\\<\\<\\d|\\w\\<\\<\\w|\\d\\<\\<\\w|\\s\\<\\<\\w","<< 前后应该间隔一个空格");
        put("\\d\\<\\=\\d|\\d\\<\\=\\s|\\s\\<\\=\\d|\\w\\<\\=\\w|\\d\\<\\=\\w|\\s\\<\\=\\w","<= 前后应该间隔一个空格");
        put("\\d\\>\\=\\d|\\d\\>\\=\\s|\\s\\>\\=\\d|\\w\\>\\=\\w|\\d\\>\\=\\w|\\s\\>\\=\\w",">= 前后应该间隔一个空格");
        put("(?:class).[a-z]","类名后的首字母建议大写");
    }};

    public final static Map<String, String> PYTHON_GRAMMAR_REGULARITY_CHECK = new LinkedHashMap() {{
        put(";$","不要在行尾加分号, 也不要用分号将两条命令放在同一行");
        put(".{79,80}","每行不超过80个字符");
        put("\\w,\\w|\\w:\\w|\\w;\\w|\\s,\\w|\\s:\\w|\\s;\\w|\\s;\\s","不要在逗号,分号,冒号前面加空格, 但应该在它们后面加(除了在行尾)");
        put("spam\\s\\(.*\\)|dict\\s\\[.*\\]|list\\s\\[.*\\]","参数列表, 索引或切片的左括号前不应加空格");
        put("\\w=\\w|\\w==\\w|\\w<\\w|\\w>\\w|\\w!=\\w|\\w<>\\w|\\w<=\\w|\\w>=\\w|\\s=\\w|\\s==\\w|\\s<\\w|\\s>\\w|\\s!=\\w|\\s<>\\w|\\s<=\\w|\\s>=\\w|\\w=\\s|\\w==\\s|\\w<\\s|\\w>\\s|\\w!=\\s|\\w<>\\s|\\w<=\\s|\\w>=\\s","在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <>, <=, >=),算术操作符两边的空格空格保持一致");
        put("(\\+=)(\\s|\\'|[A-Za-z])","避免在循环中用+和+=操作符来累加字符串. 由于字符串是不可变的, 这样做会创建不必要的临时对象, 并且导致二次方而不是线性的运行时间. 作为替代方案, 你可以将每个子串加入列表, 然后在循环结束后用 .join 连接列表;(也可以将每个子串写入一个 cStringIO.StringIO 缓存中.)");
    }};

    public final static Map<String, String> CLang_GRAMMAR_REGULARITY_CHECK = new LinkedHashMap() {{
        put("if\\(\\)|while\\(\\)|for\\(\\)|else\\(\\)|switch\\(\\)|catch\\(\\)","if( while( for(等if和(之间需要间隔一个空格");
        put("\\w=\\w|\\w=\\d|\\w=\\\"|\\s=\\\"|\\s=\\d|\\\"=\\s|\\w=\\s|\\w==\\w|\\w==\\d|\\w==\\\"|\\s==\\\"|\\w==\\s|\\s==\\d|\\\"==\\s","等号前后需要间隔一个空格");
        put("int.(.),.*|String.*,.*|long.*,.*|char.*,.*|byte.*,.*|double.*,.*|boolean.*,.*|short.*,.*|float.*,.*|auto.*,.*|signed.*,.*|const.*,.*","建议定义变量时一行最好只定义一个变量并进行一个初始化赋值");
        put("\\s;",";紧跟处不留空格");
        put("\\(.*;\\w[^(]*\\)",";不是一行的结束符号，其后要留空格");
        put("\\(.*,\\w[^(]*\\)",",之后要留空格");
       // put("\\w=\\w|\\w=\\s|\\s=\\w|\\w==\\w|\\w==\\s|\\s==\\w|\\w!=\\w|\\w!=\\s|\\s!=\\w|\\w\\+=\\w|\\w\\+=\\s|\\s\\+=\\w|\\w-=\\w|\\w-=\\s|\\s-=\\w|\\w\\*=\\w|\\w\\*=\\s|\\s\\*=\\w|\\w\\/=\\w|\\w\\/=\\s|\\s\\/=\\w|\\w>>=\\w|\\w>>=\\s|\\s>>=\\w|\\w<<=\\w|\\w<<=\\s|\\s<<=\\w|\\w\\&=\\w|\\w\\&=\\s|\\s\\&=\\w|\\w\\^=\\w|\\w\\^=\\s|\\s\\^=\\w|\\w\\|=\\w|\\w\\|=\\s|\\s\\|=\\w|\\w<=\\w|\\w<=\\s|\\s<=\\w|\\w=>\\w|\\w=>\\s|\\s=>\\w|\\w<\\w|\\w<\\s|\\s<\\w|\\w>\\w|\\w>\\s|\\s>\\w|\\w\\/\\w|\\w\\/\\s|\\s\\/\\w|\\w\\&\\&\\w|\\w\\&\\&\\s|\\s\\&\\&\\w|\\w\\|\\w|\\w\\|\\s|\\s\\|\\w|\\w\\|\\|\\w|\\w\\|\\|\\s|\\s\\|\\|\\w|\\w\\^\\w|\\w\\^\\s|\\s\\^\\w","双目运算符的前后应当加空格");
    }};
}
